<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        // 1.JS延迟加载的方式有哪些？（5）
        // script标签defer属性
        // 脚本代码写在body标签之后
        // 定时器setTimeout

        // 2.前端 JavaScript 中的 ECMAScript、DOM、BOM 的含义；
        //ECMAScript：javascript的核心，是所有浏览器厂商共同遵守的一套JS语法语法规范
        //DOM：document object model文档对象模型，提供与网页内容交互的方法和接口
        //BOM：brower object model，浏览器对象模型，提供与浏览器交互的方法和接口

        // 3.JavaScript 的数据类型有哪些？
        //基本/简单数据类型：String字符串、Number数字、Boolean布尔、Undefined、Null、Symblo
        //引用/复杂数据类型：Array数组、Object对象、Fnction函数

        // 4.如何进行数据类型的判断？
        //typeof：返回的是相对于的数据类型（但是对于null/array/object检测结果为object，不能进一步判断）
        //instanceof：返回的是布尔值，（但是不能区别undefined和null，而且简单数据类型还得是new声明出来的）
        //Object.prototype.toString.call(检测的数据)

        // 5.null 和 undefined 的区别？什么时候会得到 undefined？
        //null：表示空值，空对象，表示一个空对象的引用，不存在这个对象，空的对象指针。
        //undefined；一个没有值的变量，就是声明了变量，但是没有赋值。

        // 6.如何理解 null == undefined 返回 true，null === undefined 返回 false？
        //null和undefined。它们两个虽然是不同的数据类型，但是用instanceof检测数据类型都false。
        //==是比较值，都是空值
        //===比较值和数据类型

        // 7.使用 continue 或 break 终止循环时，两种方式的区别是？
        //continue，是跳过使用它的语句，忽略它往下继续循环
        //break，遇到使用它的语句，就停止循环

        // 8.如何判断字符串内是否包含指定字符？
        //indexOf(想查找的字符，开始查找的下标)，从开始下标正向往右寻找
        //lastIndexOf(想查找的字符，开始查找的下标)，从开始查找的下标，向左开始，倒着寻找
        //如果输出了0或正整数，那就能字符串内包含指定字符
        //如果输出了-1，那就是字符串内不包含指定字符
        //includes()判断数组、字符串、数字中是否包含有指定的值（就是值，不用考虑数据类型，"1"和1）（返回布尔值）


        // 9.请尽量列举出数组的方法，并且注明哪些方法会修改原数组，哪些不会；
        //concat（）   连接———————————————————不会
        //join（）     转换为字符串————————————不会
        //slice（）    截取———————————————————不会
        //splice()     获取规定范围内的数组——————会
        //reverse()    翻转—————————————————————会
        //push（）pop（）    末端添加/删除数组成员—————————会
        //unshift()shift（） 首端添加/删除数组成员—————————会

        //indexOf()     指定字符串首次出现的位置——————不会
        //lastIndexOf() 指定字符串最后出现的位置——————不会
        //includes()    判断是否有指定的字符串————————不会

        // 10. var、let、const 区别？
        //var 声明变量，没有块的概念，可以跨块访问, 不能跨函数访问。
        //let 声明变量，只能在块作用域里访问，不能跨块访问，也不能跨函数访问。
        //const 声明常量，使用时必须初始化(即必须赋值)，只能在块作用域里访问，而且不能修改。


        // 12. 如何在 DOM2 级事件绑定上传递参数？
        //addEventListener，IE的DOM2级事件特殊，是通过attachEvent绑定；
        //参数：
        // type:监听指定事件类型
        // callback：当指定的事件被触发的时候，会接收一个事件通知，去执行回到函数
        // boolean:
        // false：冒号阶段触发，默认值；
        // true：捕获阶段触发


        // 13. 怎么阻止事件的进一步传播和默认事件？
        //通过调用事件对象的preventDefault()方法取消事件的默认操作

        // 14. 如何添加一个一次性事件？
        // onetime event
        //例如：onetime(document.getElementById("myelement"), "click", function(){});

        // 15. 同步和异步的区别?
        //同步是按照顺序一个一个来，不会乱掉，更不会出现上面代码没有执行完就执行下面的代码， 缺点：是解析的速度没有异步的快；
        //异步是接取一个任务，直接给后台，在接下一个任务，一直一直这样，谁的先读取完先执行谁的， 缺点：没有顺序 ，谁先读取完先执行谁的 ，会出现上面的代码还没出来下面的就已经出来了，会报错；

        // 16. AJAX是什么？AJAX是如何为页面注入灵魂？
        //可以在不重选加载页面的情况下，与服务器交换数据，并实现部分页面更新。
        //(1)创建 let xhr = new XMLHttpRequest();
        //(2)初始化，设置请求方式和请求地址 xhr.open(“GET","地址")
        //(3)发送请求 xhr.send()
        //(4)监听请求状态，利用onreadystatechange 事件监听
        //(5)处理服务端返回的结果

        // 17. 开发阶段的 AJAX 跨域有哪些解决方法，jsonp 的原理是什么
        //(1)后端如何解决跨域问题
        //由后端设置响应头Response Header，即设置白名单，可访问
        //"Access-Control-Allow-Origin":"指定的域名地址" || *

        //(2)前端如何解决跨域问题
        //(2-1)jsonp
        //原理：利用script的src属性，不考虑跨域问题。它不会受同源影响。
        //(2-2)正向代理和反向代理
        //原理：服务器直接的访问，是不存在跨域问题的
        //方法：建立自己的服务器，向别的服务器发送请求，获取数据后，再返回给自己

        // 18. 请描述一下cookies，sessionStorage和localStorage的区别
        //cookies——大小：4K；与服务器通信：http请求头中；生命周期：可自己设置默认到浏览器关闭；易用性：一般自己封装。
        //sessionStorage——大小：5MB；与服务器通信：不参与；生命周期：浏览器关闭；易用性：接口可以直接使用。
        //localStorage——大小：5MB；与服务器通信：只在客户端；生命周期：除非自己删除，或清除缓存，否则一直存在；易用性：接口可以直接使用。


        // 19. 讲一下常见的异步场景，以及传统异步的诟病和解决方案
        // 使用场景网络请求，如 ajax请求、图片加载

        // 20. 数组如何实现去重？请提供至少2种方法
        //（1）新建一新数组，遍历传入数组，值不在新数组就push进该新数组中
        // function uniq(array){
        //     var temp = []; //一个新的临时数组
        //     for(var i = 0; i < array.length; i++){
        //         if(temp.indexOf(array[i]) == -1){
        //             temp.push(array[i]);
        //         }
        //     }
        //     return temp;
        // }

        // var aa = [1,2,2,4,9,6,7,5,2,3,5,6,5];
        // console.log(uniq(aa));

        //（2）给传入数组排序，排序后相同值相邻，然后遍历时,新数组只加入不与前一值重复的值。
        //function uniq(array){
        //     array.sort();
        //     var temp=[array[0]];
        //     for(var i = 1; i < array.length; i++){
        //         if( array[i] !== temp[temp.length-1]){
        //             temp.push(array[i]);
        //         }
        //     }
        //     return temp;
        // }

        // var aa = [1,2,"2",4,9,"a","a",2,3,5,6,5];
        // console.log(uniq(aa));


        // 21. 讲一下对基本数据类型 和 复杂/引用数据类型的理解？
        //不论是基本数据类型还是引用类型，他们都会先在栈中分配一块内存，对于基本类型来说，这块区域包含的是基本类型的内容；而对于复杂类型来说，这块区域包含的是指向真正内容的指针，真正的内容被手动的分配在堆上。

        // 22. this 的指向如何确定？
        //this 的指向，是在函数被调用的时候确定的，在函数执行过程中，this 一旦被确定，就不可更改了，在一个函数上下文中，this 由调用者提供，由调用函数的方式来决定。


        // 23. 谈谈对垃圾回收机制的认识
        //垃圾回收机制的是内存

        // 24. 什么是回流重绘，如何进行优化？
        //回流：当render tree的一部分或者全部元素因改变了自身的宽高，布局，显示或隐藏，或元素内部的文字结构发生变化，导致需要重新构建页面的时候，回流就产生了。
        // 重绘：当一个元素自身的宽高，布局，及显示或隐藏没有改变，而只是改变了元素的外观风格的时候，就产生了重绘。
        // 结论：回流必定触发重绘，而重绘不一定出发回流。
        // 如何避免回流：1、不使用能够触发回流的属性；2、建立一个图层，让回流在图层里面进行，限制回流和重绘的范围，减少浏览器的运算工作量。


        // 25. 请解释什么是事件代理
        //事件代理（Event Delegation），又称之为事件委托。是 JavaScript 中常用绑定事件的常用技巧。顾名思义，“事件代理”即是把原本需要绑定的事件委托给父元素，让父元素担当事件监听的职务。事件代理的原理是DOM元素的事件冒泡


        // 26. 谈谈你对渐进增强和优雅降级的理解(补充)
    </script>
</body>

</html>